package _10_effective_java;

import _1_常用数据类型_关键字._3_AboutString;
import com.google.common.collect.ForwardingCollection;

import java.util.Properties;
import java.util.Stack;

public class _4_ClassesAndInterfaces {
    /**
     * Item15
     * 使类和成员 可访问性 尽可能小，只暴露 必要的 api

     * Item16
     * public 类 使用 get set方法，而不是 public 属性
     *
     * Item17
     * 使 可变性  尽可能小
     * 不可变类：实例化之后，值不能被改变，表面上的改变实际上是重新实例化一个新对象并重新引用
     * 不可变类的好处：
     *      1. 简单
     *      2. 线程安全，可以共享
     *              例: 频繁用到的值，提供 public static final 常量
     * 缺点：
     *   对于每一个不同的值，都需要一个新对象，在对象要频繁改变的时候
     *   因此，在对象要频繁改变而过程值被丢弃，这种情况下不适合使用不可变类 {@link _3_AboutString#compareStringBuilderBuffer()}
     *
     * Item18
     * 复合优于继承：
     *      继承只有在 B is A 的情况下，可以用 B继承A
     *      java类库的错误：{@link Stack} 继承 Vector (栈并不是向量); {@link Properties} 继承 Hashtable (属性列表不是散列表)
     *      继承的缺点:
     *          1. 父类在子类完成后，又做更改，遗传给子类
     *          2. 子类调用super方法时，造成隐患
     *          3. 父类在子类创建后，添加方法，与子类重复，造成子类方法不编译或子类方法与父类不一致
     *          4. 通过子类从父类继承的方法，直接更改父类本不应该暴露出来的元素，造成不安全
     * 优先使用 复合:
     *      转发类 reusable forwarding class  + 包装类 wrapper class
     *      {@link  ForwardingCollection}
     *
     *
     * Item19
     * 为继承设计，并详注文档，或者禁止继承
     */
    public void aboutClass() {
    }
}
